/**
 * 单例模式 - 确保一个类只有一个实例，并提供一个全局访问点
 * 
 * 这是懒汉式单例模式的实现，使用双重检查锁定来确保线程安全
 * 并在首次使用时才创建实例（延迟加载）
 */
package com.mkx.creationals.singleton;

public class Singleton {
    // volatile关键字确保多线程环境下，instance变量的可见性，防止指令重排序
    private static volatile Singleton instance;
    
    // 私有构造函数，防止外部直接实例化
    private Singleton() {
        // 防止通过反射创建多个实例
        if (instance != null) {
            throw new RuntimeException("请使用getInstance()方法获取实例");
        }
        System.out.println("Singleton实例被创建");
    }
    
    /**
     * 获取单例实例的全局访问点
     * 
     * @return Singleton实例
     */
    public static Singleton getInstance() {
        // 第一次检查，避免不必要的同步
        if (instance == null) {
            // 同步锁，确保线程安全
            synchronized (Singleton.class) {
                // 第二次检查，避免多次实例化
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
    
    /**
     * 示例方法，展示单例的功能
     */
    public void showMessage() {
        System.out.println("Hello from Singleton!");
    }
}